package chapter1_9_deadlock;

/**
 * 死锁产生的条件
 * <p>
 * 互斥条件： 指线程对己经获取到的资源进行排它性使用， 即该资源同时只由一个线
 * 程占用。如果此时还有其他线程请求获取该资源，则请求者只能等待，直至占有资
 * 源的线程释放该资源。
 * · 请求并持有条件： 指一个线程己经持有了至少一个资源， 但又提出了新的资源请求，
 * 而新资源己被其他线程占有，所以当前线程会被阻塞，但阻塞的同时并不释放自己
 * 己经获取的资源。
 * · 不可剥夺条件： 指线程获取到的资源在自己使用完之前不能被其他线程抢占， 只有
 * 在自己使用完毕后才由自己释放该资源。
 * · 环路等待条件： 指在发生死锁时， 必然存在一个线程→资源的环形链， 即线程集合
 * {TO , TL T2 ，…， Tn ｝中的TO 正在等待一个Tl 占用的资源， Tl 正在等待T2 占
 * 用的资源，……Tn 正在等待己被TO 占用的资源。
 *
 * @author huayuhao
 * @date 2020/12/16 11:42
 */
public class DeadLockTest2 {

    private static Object resourceA = new Object();
    private static Object resourceB = new Object();

    public static void main(String[] args) {

        Thread A = new Thread(() -> {
            synchronized (resourceA) {
                System.out.println("A 获取了A锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "接着获取B");
                synchronized (resourceB) {
                    System.out.println("A 获取了B锁");
                }
            }
        });

        Thread B = new Thread(() -> {
            synchronized (resourceB) {
                System.out.println("B 获取了B锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "接着获取A");
                synchronized (resourceA) {
                    System.out.println("B 获取了A锁");
                }
            }
        });
        A.start();
        B.start();
    }


}
